//封装数据库连接文件
//引入 mongoose
const mongoose = require('mongoose')

const db = 'mongodb://localhost/test' //mongodb://数据库ip地址:端口号/数据库名

const connect = () => {
  //连接mongoDB数据库
  mongoose.connect(db, {useNewUrlParser:true, useUnifiedTopology: true})
  //记录数据库连接的次数
  let maxConnectTimes = 0
  return new Promise((resolve, reject) => {
    //连接成功
    mongoose.connection.once('open', () => {
      console.log('-------mongodb数据库连接成功--------')
      resolve(mongoose)
    })

    //连接中断
    mongoose.connection.once('close', () => {
      console.log('--------数据库连接断开--------')
      if(maxConnectTimes < 3){
        maxConnectTimes++
        mongoose.connect(db, {useNewUrlParser:true, useUnifiedTopology: true})
      }else{
        reject(new Error('数据库连接断开'))
        throw new Error('数据库连接断开')
      }
    })

    // //调用Schema
    // let Schema = mongoose.Schema
    // //创建Schema对象（约束，模型对象）
    // var stuSchema = new Schema({
    //     name: String,
    //     age: Number,
    //     gender:{
    //         type: String,
    //         default:'male' //定义默认类型

    //     },
    //     addr: String,
    //     timestamps: {
    //         type: Date,
    //         default: Date.now
    //     }
    // })

    //1.通过Schema创建Model
    //2.Model 代表的是数据库中的集合，通过Model才能对数据库进行操作
    //映射：将stuSchema映射到一个MongoDB collection并定义这个文档的构成
    //相当于在数据库中新建一张表，参数 （表名即集合名，创建的模型对象new对象）
    //var stuModle = mongoose.model('student', stuSchema) 
    
    //通过映射返回的值，对数据库进行增删改查
    //向student数据库中插入数据（相当于往表中插入一条数据，增加一条数据）
    //增加 create(插入的数据，插入结果函数) 
    // stuModle.create([  //[]数组，表示插入多条数据，{}就是一条
    //   { name:"阿大", age:"25", addr:"北京" },
    //   { name:"阿二", age:"23", addr:"北京" },
    //   { name:"幺三", age:"18", addr:"北京" }
    // ],(err,docs)=>{
    //     if(!err){
    //       console.log('插入成功'+docs) //docs 是当前插入的数据
    //     }else{
    //       throw err
    //     }
    // })


    //查询 find(查询条件，查询结果function)
    // stuModle.find({name: '李四'}, (err, docs) => {
    //   if(!err){
    //     console.log('查询结果类型', typeof docs)
    //     console.log('查询结果', docs)
    //   }else{
    //     throw err
    //   }
    // })


    //定义查询结果显示字段（如下，只显示name和age）
    // stuModle.find({},{name: 1, age: 1, _id: 0}, (err, docs) => {
    //   if(!err){
    //     console.log('结果只显示name和age，不显示id', docs)
    //   }else{
    //     throw err
    //   }
    // })


    //定义查询结果显示字段(skip:2 开始位置，limit: 3 取出信息条数)
    // stuModle.find({}, '_id name age', {skip:2, limit: 3}, (err, docs) => {
    //   if(!err){
    //     console.log('根据条件查询和返回结果', docs)
    //   }else{
    //     throw err
    //   }
    // })


    //修改 updateOne({要修改某条数据}, {属性：新值}, 修改结果function)
    //updateOne(), updateMany(), replaceOne()
    // stuModle.updateOne({name: '阿大'}, {age: 28, addr: '三亚'}, (err, docs) => {
    //   if(!err){
    //     console.log('修改成功', docs)
    //   }else{
    //     throw err
    //   }
    // })

    
    //删除 deleteOne({删除条件}, 删除结果)，deleteMany()删除多个
    // stuModle.deleteMany({name: '李四'}, (err) => {
    //   if(!err){
    //     console.log('删除成功')
    //   }else{
    //     throw err
    //   }
    // })

    
    //统计文档个数 count()
    // stuModle.count({}, (err) => {
    //   if(!err){
    //     console.log('统计文档个数', count)
    //   }else{
    //     throw err
    //   }
    // })

  })

}

module.exports = connect


